package E_2024;

/*
    评估一个网络的 信号质量，其中一个做法是将网络划分为栅格，然后对每个栅格的信号质量计算。
    路测的时候，希望选择一条信号最好的路线(彼此相连的栅格集合)进行演示。
    现给出 R行 C列的整数数组 Cov 。每个单元格的数值 S 即为该栅格的信号质量(已归一化，无单位,值越大信号越好)。
    要求从[0,0]到[R - 1,C - 1] 。设计一条最优路测路线。返回该路线得分
    规则:
    1.路测路线可以 上下左右四个方向，不能对角
    2.路线的评分是以路线上信号最差的栅格为准的。例如路径 8 -> 4 -> 5 -> 9 的值为 4，该线路评分为 4。线路最优表示该条线路的评分最高。
输入
    第一行表示栅格的行数 R; 第二行表示栅格的列数 C: 第三行开始，每一行表示栅格地图一行的信号值，每个单元格的数值为 S 1< R, C < 20 1 < S < 65535
输出
    最优路线的得分
样例输入
    3
    3
    5 4 5
    1 2 6
    7 4 6
样例输出
    4
 */
public class E_200_31 {
    public static void main(String[] args) {
        System.out.println(ans(new int[][]{{5,4,5},{1,2,6},{7,4,6}}));
    }
    public static int ans(int[][] arr){
        int[][] temp = new int[arr.length][arr[0].length];
//        return dfs(arr, 0,0, arr[0][0], temp);
        return bfs(arr, 0,0, arr[0][0], temp);
    }
    static int[][] x = new int[][]{{0,-1},{0,1},{-1,0},{1,0}};
    private  static int bfs(int[][] arr, int i, int j, int min, int[][] temp){
        if (i == arr.length -1 && j == arr[0].length - 1) return min;
        int m = 0;
        int n = 0 ;
        temp[i][j] = 1;
        for (int k = 0; k < x.length; k++) {
            int[] s = x[k];
            int ii = i + s[0];
            int jj = j + s[1];
            if (ii >= 0 && jj >= 0 && ii < arr.length && jj < arr[0].length && temp[ii][jj] == 0 && arr[ii][jj] > n){
                m = k;
                n = arr[ii][jj];
            }
        }
        return bfs(arr,i+x[m][0], j+x[m][1], Math.min(n,min), temp);
    }
    private static int dfs(int[][] arr, int i, int j, int min, int[][] temp) {
        if (i < 0 || j < 0 || i == arr.length || j == arr[0].length || temp[i][j] == 1) return -1;
        min = Math.min(min, arr[i][j]);
        if (i == arr.length -1 && j == arr[0].length - 1) return min;
        temp[i][j] = 1;
        int a = dfs(arr, i, j + 1, min, temp);
        int b = dfs(arr, i, j - 1, min, temp);
        int c = dfs(arr, i + 1, j, min, temp);
        int d = dfs(arr, i - 1, j, min, temp);
        temp[i][j] = 0;
        return Math.max(min, Math.max(Math.max(a,b), Math.max(c,d)));
    }
}
